package com.hqd.ch03.v51.beans.factory.config;

import com.hqd.ch03.v51.beans.BeanMetadataElement;
import com.hqd.ch03.v51.config.ConstructorArgumentValues;
import com.hqd.ch03.v51.config.MutablePropertyValues;
import com.hqd.ch03.v51.core.AttributeAccessor;
import com.hqd.ch03.v51.core.ResolvableType;
import com.hqd.ch03.v51.factory.ConfigurableBeanFactory;

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    /**
     * 单例
     */
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    /**
     * 多利
     */
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

    /**
     * 表示该 Bean 是应用程序的主要组成部分，通常对应用户自定义的 Bean
     */
    int ROLE_APPLICATION = 0;
    /**
     * 表示该 Bean 是某个更大配置的支持部分，通常是外部 ComponentDefinition 的一部分
     */
    int ROLE_SUPPORT = 1;
    /**
     * 表示该 Bean 提供完全的后台角色，对最终用户无关紧要。用于注册完全属于内部工作的 Bean
     */
    int ROLE_INFRASTRUCTURE = 2;

    /**
     * 获取父类
     *
     * @return
     */
    String getParentName();

    void setParentName(String parentName);

    /**
     * 获取bean对应的class全路径
     *
     * @return
     */
    String getBeanClassName();

    void setBeanClassName(String beanClassName);

    /**
     * 获取作用域
     *
     * @return
     */
    String getScope();

    void setScope(String scope);

    /**
     * 是否懒加载
     *
     * @return
     */
    boolean isLazyInit();

    void setLazyInit(boolean lazyInit);


    String[] getDependsOn();

    void setDependsOn(String... dependsOn);

    /**
     * 是否自动注入
     *
     * @return
     */
    boolean isAutowireCandidate();

    void setAutowireCandidate(boolean autowireCandidate);

    /**
     * 是否默认bean
     *
     * @return
     */
    boolean isPrimary();

    void setPrimary(boolean primary);

    String getFactoryBeanName();

    void setFactoryBeanName(String factoryBeanName);


    String getFactoryMethodName();

    void setFactoryMethodName(String factoryMethodName);

    ConstructorArgumentValues getConstructorArgumentValues();

    void setConstructorArgumentValues(ConstructorArgumentValues cvs);

    default boolean hasConstructorArgumentValues() {
        return !getConstructorArgumentValues().isEmpty();
    }

    MutablePropertyValues getPropertyValues();

    default boolean hasPropertyValues() {
        return !getPropertyValues().isEmpty();
    }

    /**
     * 获取初始化方法名
     *
     * @return
     */
    String getInitMethodName();

    void setInitMethodName(String initMethodName);

    /**
     * 获取销毁方法名
     *
     * @return
     */
    String getDestroyMethodName();

    void setDestroyMethodName(String destroyMethodName);

    int getRole();

    void setRole(int role);

    String getDescription();

    void setDescription(String description);

    ResolvableType getResolvableType();

    boolean isSingleton();

    boolean isPrototype();

    boolean isAbstract();

    String getResourceDescription();

    BeanDefinition getOriginatingBeanDefinition();

    String getId();

    void setId(String id);

    MutablePropertyValues getProperties();

    void setProperties(MutablePropertyValues pvs);

    boolean hasBeanClass();

    Boolean isFactoryBean();

    Class<?> resolveBeanClass(ClassLoader beanClassLoader) throws ClassNotFoundException;
}
